{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "# Marshalモジュール\n",
    "\n",
    "* Marshalモジュール\n",
    "    * Rubyのオブジェクトを文字列化し、ファイルに書き出したり読み戻したりする機能\n",
    "    * この文字列化したデータを「マーシャルデータ」という\n",
    "    * <font color=\"red\">Railsのセッション変数をクッキーやデータベースを登録する時</font>などに利用される\n",
    "    * 一部書き出せないクラスがあったり、書き出すオブジェクトに制限がある\n",
    "        * 名前のついてないクラスやモジュールはArgumentError\n",
    "        * システムがオブジェクトの状態を保持するような、IO,Dir,Fileクラスなど\n",
    "        * MatchData,Proc,Threadクラスなどのインスタンス\n",
    "        * クラスメソッドを定義したオブジェクト\n",
    "        * これらのオブジェクトを間接的に指定しているクラスのオブジェクト\n",
    "            * 初期値をブロックで指定したHashクラスのオブジェクトなど"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\"\\x04\\b[\\rI\\\"\\tThis\\x06:\\x06ET:\\aisI\\\"\\x06a\\x06;\\x00T:\\bpenii0FT\"\n",
      "[\"This\", :is, \"a\", :pen, 100, nil, false, true]\n"
     ]
    }
   ],
   "source": [
    "p Marshal.dump([\"This\", :is, \"a\", :pen, 100, nil, false, true])\n",
    "\n",
    "Dir.mkdir(\"/tmp/tmp2\", 0755) unless Dir.exist?(\"/tmp/tmp2\")\n",
    "Dir.chdir(\"/tmp/tmp2\")\n",
    "\n",
    "### ファイルへの書き出し\n",
    "file = File.open(\"/tmp/tmp2/marshal.txt\", \"w+\")\n",
    "  Marshal.dump([\"This\", :is, \"a\", :pen, 100, nil, false, true], file)\n",
    "file.close\n",
    "\n",
    "### ファイルから読み込み\n",
    "file = File.open(\"/tmp/tmp2/marshal.txt\", \"r\")\n",
    "  a = Marshal.load(file)\n",
    "file.close\n",
    "\n",
    "puts a"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Ruby 2.3.1",
   "language": "ruby",
   "name": "ruby"
  },
  "language_info": {
   "file_extension": ".rb",
   "mimetype": "application/x-ruby",
   "name": "ruby",
   "version": "2.3.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
